package com.dragon.modules.yuegou.utils;


import com.dragon.modules.yuegou.enums.YsqAppType;
import com.dragon.modules.yuegou.web.ClientInfo;

/**
 * 应用
 * 
 * @author liuwu
 *
 */
public class AppUtils {

	private static final long MASK = 0xff;

	/**
	 * 获取当前应用类型<br>
	 * 请注意，只能在HTTP请求线程使用，在后台线程中调用这个方法将会抛出异常
	 * 
	 * @return 当前应用类型
	 */
	public static YsqAppType current() {
		return typeOf(ClientInfo.current().getAppid());
	}

	/**
	 * 获取某个应用ID的应用类型
	 * 
	 * @param appid 应用ID
	 * @return 应用类型
	 */
	public static YsqAppType typeOf(String appid) {
		try {
			return typeOf(Long.parseLong(appid));
		} catch (NumberFormatException e) {
			throw new IllegalArgumentException("应用ID必须是一个整数");
		}
	}
	
	/**
	 * 获取某个应用ID的应用类型
	 * 
	 * @param appid 应用ID
	 * @return 应用类型
	 */
	public static YsqAppType typeOf(Long appid) {
		int typeId = (int) (appid & MASK);
		return YsqAppType.from(typeId);
	}

	/**
	 * 产生某一应用类型的下一个appid<br>
	 * 使用某种规则，让appid中携带应用类型信息
	 * 
	 * @param maxAppid 最大的appid
	 * @return 应用ID
	 */
	public static String nextAppid(String maxAppid) {
		Long appId = Long.parseLong(maxAppid);
		return nextAppid(appId);
	}
	
	/**
	 * 产生某一应用类型的下一个appid<br>
	 * 使用某种规则，让appid中携带应用类型信息
	 * 
	 * @param maxAppid 最大的appid
	 * @return 应用ID
	 */
	public static String nextAppid(Long maxAppid) {
		int typeId = (int) (maxAppid & MASK);
		long seq = maxAppid >>> 8;
		long nextSeq = seq + 1;
		long nextAppId = (nextSeq << 8) | typeId;
		return String.valueOf(nextAppId);
	}

	/**
	 * 产生某一应用类型的第一个appid<br>
	 * 使用某种规则，让appid中携带应用类型信息
	 * 
	 * @param type 应用类型
	 * @return 应用ID
	 */
	public static String firstAppid(YsqAppType type) {
		return String.valueOf(type.getTypeId());
	}

}
